package demo01Array;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User:咭咭熊
 * Date:2021 - 09 - 08
 * Time:14:49
 */

import java.util.Arrays;

/***
 * 数组相关练习题
 */
public class ArrPractice {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        //数组数字排列
        arrNumSort(arr);
        System.out.println(Arrays.toString(arr));

    }
    // 1.找到数组中的最大元素
    public static int findMax(int[] array){
        int max = array[0];
        for (int i = 0; i < array.length; i++) {
            if(array[i] > max){
                max = array[i];
            }
        }
        return max;
    }

    // 2.求数组中元素的平均值
    public static double Avg(int[] array){
        double sum = 0.0;
        for (int i = 0; i < array.length; i++) {
            sum += array[i];
        }
        double ret = sum /array.length;
        return ret;
    }

    // 3.查找数组中指定元素的下标——顺序查找
    public static int findNum(int[] array,int key){
        for (int i = 0; i < array.length; i++) {
            if(array[i] == key){
                return  i;
            }
        }
        return  -1;
    }
    // 4.查找数组中指定元素——二分查找

    /**
     * 二分查找的前提——数组必须是有序的
     * @param array
     * @return
     */
    public static int binarySearch(int[] array,int key) {
        int left = 0;
        int right = array.length - 1;
        int mid = (left + right) / 2;
        while(left <= right){
            if(array[mid] == key){
                return mid;
            }else if(array[mid] > key){
                right = mid - 1;
            }else{//array[mid] < key
                left = mid + 1;
            }
        }
        return -1;
    }

        // 5.检查数组的有序性
    public static boolean isSeq(int[] array){
        for (int i = 0; i < array.length - 1; i++) {
            if(array[i] > array[i + 1]){
                return false;
            }
        }
        return true;
    }

        // 6.数组排序——冒泡排序
    public static void bubbleSort(int[] array){
        boolean flg = false;
        //i趟数
        for (int i = 0; i < array.length - 1; i++) {
            //每一趟J，都是从下标0 开始进行比较
            for (int j = 0; j < array.length - 1 - i; j++) {
                if(array[j] > array[j + 1]){
                    int tmp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = tmp;
                    flg = true;
                }
            }
            if(flg == false){
                return;
            }
        }
    }

        // 7.数组逆序——就地逆序
    public static void reverse(int[] array){
        int i = 0;
        int j = array.length - 1;
        while(i < j){
            int tmp = array[i];
            array[i] = array[j];
            array[j] = tmp;
            i++;
            j--;
        }
    }

        // 8.数组数字排列：讲义和整型数组的所有偶数部分放在前半部分，将所有的奇数部分放在后半部分
        //思路；双指针法，用前一个下标从左往右找到第一个奇数，用后一个下标从右往左找到第一个偶数

    public static void arrNumSort(int[] array){
       int i = 0;
       int j = array.length - 1;
       while(i < j){
           while(i <j && array[i] % 2 == 0){
               i++;//继续往后走找奇数
           }
           while(i < j && array[j] % 2 != 0){
               j--;
           }
           //进行交换
           int tmp = array[i];
           array[i] = array[j];
           array[j] = tmp;
       }
    }
}
